#ifndef THREAD9_H
#define THREAD9_H

#include <stdint.h>
#include <pthread.h>
#include <time.h>

// RS485串口设备定义
#define RS485_DEVICE "/dev/ttyS5"  // RS485接口，对应外部连接器的RS485口
#define RS485_BAUDRATE B9600       // 波特率9600（常用于Modbus设备）

// 设备地址定义
#define ANEMOMETER_ADDR     0x02   // 风速仪地址
#define TEMP_HUMID_ADDR     0x01   // 温湿度传感器地址
#define FORCE_SENSOR1_ADDR  0x03   // 拉力传感器1地址
#define FORCE_SENSOR2_ADDR  0x04   // 拉力传感器2地址
#define FORCE_SENSOR3_ADDR  0x05   // 拉力传感器3地址
#define FORCE_SENSOR4_ADDR  0x06   // 拉力传感器4地址

// 缓冲区大小定义
#define RS485_TX_BUFFER_SIZE 256   // 发送缓冲区大小
#define RS485_RX_BUFFER_SIZE 256   // 接收缓冲区大小

// 超时定义
#define RS485_RESPONSE_TIMEOUT_MS 1000  // 响应超时时间（毫秒），适应9600波特率，增加到1000ms
#define RS485_RETRY_INTERVAL_MS 500    // 重试间隔时间（毫秒）
#define RS485_MAX_RETRIES 3            // 最大重试次数
#define RS485_REINIT_TIMEOUT_SEC 60    // 重新初始化超时时间（秒）

// Modbus功能码
#define MODBUS_READ_HOLDING_REGISTERS  0x03  // 读保持寄存器
#define MODBUS_READ_INPUT_REGISTERS    0x04  // 读输入寄存器
#define MODBUS_WRITE_SINGLE_REGISTER   0x06  // 写单个寄存器
#define MODBUS_WRITE_MULTIPLE_REGISTERS 0x10 // 写多个寄存器
#define MODBUS_ERROR_FLAG              0x80  // 错误响应标志位

// 错误代码定义
#define RS485_ERROR_NONE           0   // 无错误
#define RS485_ERROR_TIMEOUT        -1  // 通信超时
#define RS485_ERROR_CRC            -2  // CRC校验错误
#define RS485_ERROR_RESPONSE       -3  // 响应错误
#define RS485_ERROR_PARAMETER      -4  // 参数错误
#define RS485_ERROR_DEVICE_ADDR    -5  // 设备地址错误
#define RS485_ERROR_FUNC_CODE      -6  // 功能码错误

// 风速仪数据结构（NMEA-0183格式）
typedef struct {
    float wind_speed;            // 风速，单位：m/s
    float wind_direction;        // 风向，单位：度
    uint32_t timestamp;          // 时间戳
    uint8_t data_valid;          // 数据有效标志：1-有效，0-无效
} anemometer_data_t;

// 温湿度传感器数据结构
typedef struct {
    float temperature;           // 温度，单位：摄氏度
    float humidity;              // 湿度，单位：%RH
    uint32_t timestamp;          // 时间戳
    uint8_t data_valid;          // 数据有效标志：1-有效，0-无效
} temp_humid_data_t;

// 拉力传感器数据结构
typedef struct {
    float force;                 // 拉力值，单位：N或kg（根据传感器配置）
    uint32_t timestamp;          // 时间戳
    uint8_t data_valid;          // 数据有效标志：1-有效，0-无效
} force_sensor_data_t;

// 全局变量声明
extern anemometer_data_t g_anemometer_data;            // 风速仪数据
extern temp_humid_data_t g_temp_humid_data;            // 温湿度传感器数据
extern force_sensor_data_t g_force_sensor_data[4];     // 4个拉力传感器数据
extern pthread_mutex_t g_rs485_data_mutex;             // 数据互斥锁

// 线程9函数声明
void *thread9_function(void *arg);

// 线程控制函数
void thread9_stop(void);
int thread9_is_running(void);

// RS485串口初始化函数
int rs485_init(const char *device, int baudrate);

// 发送Modbus请求并等待响应
// 参数：fd - 串口文件描述符
//       tx_buffer - 发送缓冲区
//       tx_len - 发送数据长度
//       rx_buffer - 接收缓冲区
//       rx_buffer_size - 接收缓冲区大小
//       timeout_ms - 超时时间（毫秒）
// 返回值：接收到的数据长度，超时或错误返回负数
int rs485_send_receive(int fd, const uint8_t *tx_buffer, int tx_len, 
                      uint8_t *rx_buffer, int rx_buffer_size, int timeout_ms);

// 计算Modbus CRC16校验码
uint16_t modbus_crc16(const uint8_t *buffer, int length);

// 获取风速仪数据函数
// 返回值：0-成功，-1-失败
int get_anemometer_data(anemometer_data_t *data);

// 获取温湿度传感器数据函数
// 返回值：0-成功，-1-失败
int get_temp_humid_data(temp_humid_data_t *data);

// 获取拉力传感器数据函数
// 参数：sensor_idx - 传感器索引（0-3）
//       data - 数据结构体指针
// 返回值：0-成功，-1-失败
int get_force_sensor_data(int sensor_idx, force_sensor_data_t *data);

// 串口关闭函数
void rs485_close(int fd);

// 检查设备数据是否有效，如果无效或超时则返回错误
// 参数：timestamp - 数据时间戳
//       valid_flag - 数据有效标志
//       max_age_sec - 最大允许的数据年龄（秒）
// 返回值：1-数据有效，0-数据无效或超时
int check_data_validity(uint32_t timestamp, uint8_t valid_flag, uint32_t max_age_sec);
 
#endif /* THREAD9_H */ 